<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie du plugin «Développeur» pour Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class pDevZip
{
	
	public $core;
	public $mode;
	
	public $src;
	public $dest;
	
	public $identifiant;
	
	public $exclude = array('.','..','__MACOSX','.svn','CVS','.DS_Store','Thumbs.db');
	
    public function __construct($core, $mode)
    {
    	
    	$this->core &= $core;
    	$this->mode = $mode; 

    	foreach($this->exclude as $k => $v) {
    		 $this->exclude[$k] = '#(^|/)('.str_replace(array('.','*'),array('\.','.*?'),trim($v)).')(/|$)#';
    	}
    	
    }
    
    public function creer($src, $dest)
    {
    	
    	$this->src = $src;
    	$this->dest = $dest;

    	# Fichier de contrôle
    	if(file_exists($this->src.'/digests')) {
    		if(!is_writable($src.'/digests')) {
    			throw new cpErreur(__('Impossible d\'écrire le fichier de contrôle.'), null, 401);
    		}
    	} else {
    		if(!is_writable($this->src.'/')) {
    			throw new cpErreur(__('Impossible d\'écrire le fichier de contrôle.'), null, 401);
    		}
    	}
    	
    	$digest = '';
    	$this->creerDigest('', $digest);
    	file_put_contents($this->src.'/digests', $digest);
    	
    	# Fichier zip
    	if(file_exists($dest)) {
    		if(!is_writable($dest)) {
    			throw new cpErreur(__('Impossible d\'écrire le fichier zip.'), null, 401);
    		}
    	} elseif(is_dir(CP_CHEMIN_CACHE.'/devzip')) {
    		if(!is_writable(CP_CHEMIN_CACHE.'/devzip')) {
    			throw new cpErreur(__('Impossible d\'écrire le fichier zip.'), null, 401);
    		}
    	} else {
    		if(!is_writable(CP_CHEMIN_CACHE)) {
    			throw new cpErreur(__('Impossible d\'écrire le fichier zip.'), null, 401);
    		}
    		$filemanager = new filemanager(CP_CHEMIN_CACHE);
			$filemanager->makeDir('devzip');
    	}
    	
		@set_time_limit(300);
		$fp = fopen($dest,'w');
		$zip = new fileZip($fp);
		
		foreach($this->exclude as $e) {
			$zip->addExclusion($e);
		}
		
		$zip->addDirectory($src,$this->identifiant,true);
		
		$zip->write();
		$zip->close();
		unset($zip);
		
		fclose($fp);
		
		header('Content-Type: application/zip');
		header('Content-Disposition: attachment; filename="'.basename($dest).'"');
		readfile($dest);
		exit;
    	
    }
    
    protected function creerDigest($start, &$digest)
    {
    	
    	$f = new filemanager($this->src);
		$f->chdir($start);
		$f->getDir();
		
	    $dirs =  $f->dir['dirs'];
		$files = $f->dir['files'];
		
		foreach($dirs as $dir)
		{
			if(preg_match('/^\.(.*)$/',$dir->basename) || $dir->parent == '1') {
				continue;
			}
			
			$this->creerDigest($dir->relname, $digest, $exclude);
		}
	
		foreach($files as $file)
		{
			if($this->isExcluded($file->relname)) {
				continue;
			}
	
			$digest.=md5_file($file->file).' ./'.$file->relname."\n";
		}
		
    }
    
    
	protected function isExcluded($name)
	{
		
		if($name == 'digests') {
			return true;
		}
		
		foreach ($this->exclude as $reg) {
			if (preg_match($reg,$name)) {
				return true;
			}
		}
		
		return false;
	}

	
}

?>